miniOS_task.h #ifndef _MINI_TASK #define _MINI_TASK #define MAXTASKNUM 30 #define CONTEXTNUM 10 typedef struct _mini_free_task{ unsigned int context_spsr; unsigned int context[CONTEXTNUM]; unsigned int context_sp; unsigned int context_lr; unsigned int context_pc; }Mini_free_task; typedef struct _mini_task_manage{ Mini_free_task free_task_poolMAXTASKNUM]; int maximum_task_id; void (*init)(void); int (*create)(void(*startfunction)(void)); }Mini_task_manage; void task_init(void); int task_create(void(*startfunction)(void)); #endif TCB_task.c #include extern Mini_memory_manage memory_manage; extern Mini_task_manage task_manage; #define STARTUSRCPSR 0x68000050 int task_create(void(*startfunction(void)) { int task_index = 0; unsigned int stack_top = 0; task_manage.max_task_id++; task_index = task_manage.max_task_id; if(task_index>MAXTASKNUM) { return -1; } stack_top = memory_manage.allocation(); if(stack_top == 0) { return -2; } task_manage.free_task_pool[task_index].context_spsr = STARTUSRCPSR; task_manage.free_task_pool[task_index].context_sp = stack_top; task_manage.free_task_pool[task_index].context_pc = (unsigned int)startfunction; return task_index; } void task_init(void) { int i; for(i=0; i { task_manage.free_task_pool[i].context_spsr = 0x00; memset(task_manage.free_task_pool[i].context, 0sizeof(unsigned int)*CONTEXTNUM); task_manage.free_task_pool[i].context_sp = 0x00; task_manage.free_task_pool[i].context_lr = 0x00; task_manage.free_task_pool[i].context_pc = 0x00; } task_manage.max_task_id = -1; task_manage.init = task_init; task_manage.create = task_create; } |